package exo1;

import exception.CompteFermeException;
import exception.CompteNonTransferableException;
import exception.CreditSurPlafondException;
import exception.DebitNonAutoriseException;
import exception.DebitSousSeuilException;
import exception.ModificationPlancherException;

public class CompteCourant extends CompteSansLimite {
	private double decouvertAutorise;

	public CompteCourant(Personne nom, int numero, double solde) {
		super(nom, numero, solde, 2);
		this.decouvertAutorise = 0;
	}

	public CompteCourant(Personne nom, int numero, double solde,
			double decouvert) {
		super(nom, numero, solde, 2);
		this.decouvertAutorise = decouvert;
	}

	public double getDecouvertAutorise() {
		return decouvertAutorise;
	}

	public void setDecouvertAutorise(double decouvertAutorise)
			throws ModificationPlancherException {
		if (this.getSolde() < 0) {
			throw new ModificationPlancherException(
					"Solde négatif, impossible de modifier le découvert !");
		}
		this.decouvertAutorise = decouvertAutorise;
	}

	@Override
	public boolean transferer(Compte compte, double montant)
			throws DebitNonAutoriseException, DebitSousSeuilException,
			CreditSurPlafondException, CompteFermeException,CompteNonTransferableException {
		if (this.debiter(montant) == true) {
			compte.crediter(montant);
			return true;
		}
		return false;
	}

	@Override
	public boolean debiter(double montant) throws DebitNonAutoriseException,
			DebitSousSeuilException, CompteFermeException {
		if (this.isOuvert() == false) {
			throw new CompteFermeException("Le compte est fermé !");
		}
		double capital = this.getSolde() - montant;
		if (capital < this.decouvertAutorise) {
			throw new DebitSousSeuilException(
					"Depassement du découvert interdit !");
		}
		this.setSolde(capital);
		return true;
	}

	@Override
	public boolean crediter(double montant) throws CreditSurPlafondException,
			CompteFermeException {
		if (this.isOuvert() == false) {
			throw new CompteFermeException("Le compte est fermé !");
		}
		double capital = this.getSolde() + montant;
		this.setSolde(capital);
		return true;
	}

}
